package com.atilim.cargo.model;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import sun.misc.Compare;


@Entity
public class Vertex extends BaseModel implements Comparable<Vertex> {
	private String lon;
	private String lat;
	private String name;
	
	/**
	 * mevcut uzaklık, hesaplanmış uzaklık
	 */
	@Transient //persistan olmasın demektir
	public double minDistance = Double.POSITIVE_INFINITY;
	
	@Transient
	public Vertex previous;
	
//bağlantılı oldugu bütün linkler için bize road dizisi veriyor link .size kadar bize vertexin size kadar link veriyor
	public ArrayList<Road> getRoads (){
		ArrayList <Road> roads = new ArrayList<Road>();
		
		for (Vertex v : links) {
			roads.add(new Road(this, v));//link dizisinin size nekadarsa okadarlık roads alıyoruz büyütemeyiz roadı listlerde ekleye bildiğimiz kadar ekleyebiliriz
		}
		
		return roads;
		
	}
	
	
	
	@ManyToMany
	private Set<Vertex> links = new HashSet<Vertex>();

	public Vertex() {
		
	}
	
	public void addLink (Vertex v) {
		if (links.contains(v)) { //node bu node'un bağlantılarda varsa çık metottan
			return;
		} else {
			links.add(v);
			v.addLink(this);			
		}
	}
	
	public void removeLink (Vertex v) {
		if (links.contains(v)) { //node bu node'un bağlantılarda varsa
			links.remove(v);
			v.removeLink(this);			
		}
	
	}
	
	/**
	 * 
	 * @param vs
	 */
	public void addLink (Vertex ... vs) {
		for (Vertex vertex : vs) { //foreach
			this.addLink(vertex);
		}
	}
	
	public Vertex(String name, String lat, String lon) {
		super();
		this.lon = lon;
		this.lat = lat;
		this.name = name;
		if (this.name == "" || this.name == null) {
			this.name = "n" + Math.random();
		}
	}

	public Vertex(String name, String latlon) {
		
		String ss [] = latlon.trim().split(";");
		this.lon = ss [1].trim();
		this.lat = ss [0].trim();
		this.name = name.trim();
	}
	public String getLon() {
		return lon;
	}

	public void setLon(String lon) {
		this.lon = lon;
	}

	public String getLat() {
		return lat;
	}

	public void setLat(String lat) {
		this.lat = lat;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Vertex> getLinks() {
		return links;
	}

	public void setLinks(Set<Vertex> links) {
		this.links = links;
	}

	@Override
	public boolean equals(Object obj) {
		Vertex v = (Vertex) obj;
		return v.name.equals(this.name);
	}

	@Override
	public int hashCode() {
		return name.hashCode();
	}

	@Override
	public String toString() {
		return name + ":: " + lat + ", " + lon;
	}
	
	 public int compareTo(Vertex other) {
		 return Double.compare(minDistance, other.minDistance);
	 }

	

	
}
